source(file = "../scripts/micro_o2_jessica_phg.R")
Mise au point de la micro-électrode à oxygène
Test 1 à test 4 : apprentissage de la méthode
- Début dans l’eau
- Avancée progressive vers le coenasarc
library(tidyverse)
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages --------------------------------------------------
filter(): dplyr, stats
lag(): dplyr, stats
a <- ggplot(data = t1) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(c(6,12))
b <- ggplot(data = t2) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(c(6,12))
c <- ggplot(data = t3) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(c(6,12))
d <- ggplot(data = t4) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(c(6,12))
library(ggpubr)
Le chargement a nécessité le package : magrittr
Attachement du package : ‘magrittr’
The following object is masked from ‘package:purrr’:
set_names
The following object is masked from ‘package:tidyr’:
extract
ggarrange(a,b,c,d)

Test de reproductibilité
- réaliser 4 mesures reproductible sur différentes zones de la bouture
- 0-50 dans l’eau
- 50-125 placement sur le coenasarc
- 125-… retour dans l’eau
mouv <- c(50, 125)
a <- ggplot(data = t4a) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(5.8,9) +
geom_vline(xintercept = mouv, color = mouv)
b <- ggplot(data = t4b) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(5.8,9)+
geom_vline(xintercept = mouv, color = mouv)
c <- ggplot(data = t4c) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(5.8,9)+
geom_vline(xintercept = mouv, color = mouv)
d <- ggplot(data = t4d) +
geom_line(mapping = aes(x = time, y = O2)) +
ylim(5.8,9)+
geom_vline(xintercept = mouv, color = mouv)
ggarrange(a,b,c,d, labels = "auto")

Test 5 à test 10 : premier test sur le profil à 100 PAR
- Variation du temps pour déterminer les variations du profil
#depart coenasarc
#500 micro du coanasarc
mouv <-c(25,50,75,100,125,200,225, 250, 275, 350, 375)
a <- ggplot(t5)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
mouv <-c(25,50,75,100,125,150, 175, 200, 225, 250)
b <- ggplot(t6)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
mouv <-c(50,100,150,200, 250, 300, 350, 400, 450, 500, 550)
c <-ggplot(t8)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
mouv <-c(50,100,150,200, 250, 300, 350, 400, 450, 500, 550)
d <-ggplot(t9)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
mouv <-c(100,200,300, 400, 550)
e <- ggplot(t10)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
ggarrange(a,b,c,d,e, ncol = 2, nrow = 3, labels = "auto")

Test12 : premier profil 0 PAR
- Adaptation 5 min dans le noir
- depart coenasarc
- fin 100 \(\mu m\)
#mouv <-c(100,200,300, 400, 500)
#summary(t12)
a <- ggplot(t12,mapping = aes(x = time, y = O2))+
geom_line() +
xlim (c(0,550)) +
geom_rect(xmin = 0, xmax = 100, ymin = 0, ymax = 9, fill = "red", alpha = 0.005)+
geom_rect(xmin = 200, xmax = 300, ymin = 0, ymax = 9, fill = "red", alpha = 0.005)+
geom_rect(xmin = 400, xmax = 500, ymin = 0, ymax = 9, fill = "red", alpha = 0.005)+
annotate("text", x = c(50, 250, 450), y = 4.5, label = "0 mm") +
annotate("text", x = c(150, 350, 530), y = 4.5, label = " + 0.1 mm")+
labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous dans l'eau mesurée avec une microélectrode à oxygène placée \n sur le coenosarc (0 mm) et distant de ce dernier (0.1mm) dans l'obscurité")+
theme(plot.caption = element_text(hjust = 0.5))
a

#ggsave(filename = "test12.png", plot = a, device = "png")
- Utilisation potentiel pour réaliser des régressions linéaires
Test 13 à test 15
*idem manip test5 à test10
mouv <-c(50, 100, 150 ,200, 225, 250, 350, 400)
a <- ggplot(t13)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
mouv <-c(50, 100, 150 ,200, 250)
b <- ggplot(t14)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
mouv <-c(50, 100, 125, 175 ,225)
c <- ggplot(t15)+
geom_line(mapping = aes(x = time, y = O2))+
geom_vline(xintercept = mouv, color = mouv)
ggarrange(a,b,c, labels = "auto")

- lors du placement sur le coenasarc, on n’obtiens pas deux successivements les mêmes données
Test16 : premier test lumière on/off
- sonde placée sur le coenasarc
- temps non déterminé mais sur plateau graphique du programme de la sonde
ggplot(t16)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 10, fill = "red", alpha = 0.005)+
geom_rect(xmin = 275, xmax = 525, ymin = 0, ymax = 10, fill = "red", alpha = 0.005)+
geom_rect(xmin = 50, xmax = 275, ymin = 0, ymax = 10, fill = "blue", alpha = 0.005)+
geom_rect(xmin = 525, xmax = 1000, ymin = 0, ymax = 10, fill = "blue", alpha = 0.005)+
annotate("text", x = c(175, 650), y = 3.8, label = "0 PAR") +
annotate("text", x = c(0, 400), y = 3.8, label = " 100 PAR") +
labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous mesurée avec une microélectrode à oxygène placée \n sur le coenosarc lors de l'exposition à 0 PAR (bleu) et 100 PAR (rouge)")+
theme(plot.caption = element_text(hjust = 0.5))

#ggsave(filename = "test16.png", device = "png")
Test 17
ggplot(t17)+
geom_line(mapping = aes(x = time, y = O2)) +
geom_rect(xmin = -50, xmax = 125, ymin = 0, ymax = 10, fill = "red", alpha = 0.005)+
geom_rect(xmin = 125, xmax = 150, ymin = 0, ymax = 10, fill = "blue", alpha = 0.005)+
geom_rect(xmin = 150, xmax = 175, ymin = 0, ymax = 10, fill = "green", alpha = 0.005)+
geom_rect(xmin = 175, xmax = 200, ymin = 0, ymax = 10, fill = "blue", alpha = 0.005)+
geom_rect(xmin = 200, xmax = 300, ymin = 0, ymax = 10, fill = "red", alpha = 0.005)+
geom_rect(xmin = 300, xmax = 325, ymin = 0, ymax = 10, fill = "blue", alpha = 0.005)+
geom_rect(xmin = 325, xmax = 350, ymin = 0, ymax = 10, fill = "green", alpha = 0.005)+
geom_rect(xmin = 350, xmax = 375, ymin = 0, ymax = 10, fill = "blue", alpha = 0.005)+
geom_rect(xmin = 375, xmax = 1000, ymin = 0, ymax = 10, fill = "red", alpha = 0.005)+
labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous mesurée avec une microélectrode à oxygène placée \n sur le coenosarc (rouge), à 0.1 mm (bleu), 0.2 mm (vert) de ce dernier à 100 PAR.")+
theme(plot.caption = element_text(hjust = 0.5))

NA
a <- ggplot(t19)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 125, ymin = 0, ymax = 10, fill = "Red", alpha = 0.005)+
geom_rect(xmin = 125, xmax = 150, ymin = 0, ymax = 10, fill = "Blue", alpha = 0.005)+
geom_rect(xmin = 150, xmax = 175, ymin = 0, ymax = 10, fill = "Green", alpha = 0.005)+
geom_rect(xmin = 175, xmax = 200, ymin = 0, ymax = 10, fill = "Yellow", alpha = 0.005)+
geom_rect(xmin = 200, xmax = 350, ymin = 0, ymax = 10, fill = "purple", alpha = 0.005) +
geom_rect(xmin = 350, xmax = 375, ymin = 0, ymax = 10, fill = "Yellow", alpha = 0.005) +
geom_rect(xmin = 375, xmax = 400, ymin = 0, ymax = 10, fill = "Green", alpha = 0.005) +
geom_rect(xmin = 400, xmax = 425, ymin = 0, ymax = 10, fill = "Blue", alpha = 0.005)+
geom_rect(xmin = 425, xmax = 1000, ymin = 0, ymax = 10, fill = "Red", alpha = 0.005) +
labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)")
b <- ggplot(t20)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 125, ymin = 0, ymax = 10, fill = "Red", alpha = 0.005)+
geom_rect(xmin = 125, xmax = 150, ymin = 0, ymax = 10, fill = "Blue", alpha = 0.005)+
geom_rect(xmin = 150, xmax = 175, ymin = 0, ymax = 10, fill = "Green", alpha = 0.005)+
geom_rect(xmin = 175, xmax = 300, ymin = 0, ymax = 10, fill = "Yellow", alpha = 0.005)+
geom_rect(xmin = 300, xmax = 325, ymin = 0, ymax = 10, fill = "Green", alpha = 0.005)+
geom_rect(xmin = 325, xmax = 350, ymin = 0, ymax = 10, fill = "Blue", alpha = 0.005) +
geom_rect(xmin = 350, xmax = 1000, ymin = 0, ymax = 10, fill = "Red", alpha = 0.005) +
labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)")
library(ggpubr)
a <- ggarrange(a,b, ncol = 2, labels = "auto")
a + labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)", caption = "Variation de l'oxygène dissous mesurée avec une microélectrode à oxygène placée \n sur le coenosarc (rouge), à 0.1 mm (bleu), 0.2 mm (vert), 0.3 mm (jaune) et 0.4 (mauve) de ce dernier à 100 PAR, \n sur une zone fortement pigmentée (A) et faiblement pigmentée (B).")+
theme(plot.caption = element_text(hjust = 0.5, size = 10))

ggplot(t21)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 150, ymin = 0, ymax = 10, fill = "Red", alpha = 0.005)+
geom_rect(xmin = 150, xmax = 200, ymin = 0, ymax = 10, fill = "Blue", alpha = 0.005)+
geom_rect(xmin = 200, xmax = 250, ymin = 0, ymax = 10, fill = "Green", alpha = 0.005)+
geom_rect(xmin = 250, xmax = 300, ymin = 0, ymax = 10, fill = "Yellow", alpha = 0.005)+
geom_rect(xmin = 300, xmax = 350, ymin = 0, ymax = 10, fill = "purple", alpha = 0.005) +
geom_rect(xmin = 350, xmax = 500, ymin = 0, ymax = 10, fill = "sky blue", alpha = 0.005) +
geom_rect(xmin = 500, xmax = 550, ymin = 0, ymax = 10, fill = "purple", alpha = 0.005) +
geom_rect(xmin = 550, xmax = 600, ymin = 0, ymax = 10, fill = "Yellow", alpha = 0.005) +
geom_rect(xmin = 600, xmax = 650, ymin = 0, ymax = 10, fill = "Green", alpha = 0.005) +
geom_rect(xmin = 650, xmax = 700, ymin = 0, ymax = 10, fill = "Blue", alpha = 0.005)+
geom_rect(xmin = 700, xmax = 1000, ymin = 0, ymax = 10, fill = "Red", alpha = 0.005) +
labs(x = "Oxygène dissous (mg/L)", y = "Temps (s)")

#t22 on laisse sur le coté car demande bcp de temps pour une résultat qui montre que au bout de 50 sec à 0.1 on a pas atteint le plateau
test distance par rapport au coenosarc
t23 <-microO2_import(file = "../data/T23/T232010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)236 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T23/T232010.txt' file 2 2 <NA> 31 columns 30 columns '../data/T23/T232010.txt' row 3 3 <NA> 31 columns 30 columns '../data/T23/T232010.txt' col 4 4 <NA> 31 columns 30 columns '../data/T23/T232010.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T23/T232010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t24 <-microO2_import(file = "../data/T24/T242010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)235 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T24/T242010.txt' file 2 2 <NA> 31 columns 30 columns '../data/T24/T242010.txt' row 3 3 <NA> 31 columns 30 columns '../data/T24/T242010.txt' col 4 4 <NA> 31 columns 30 columns '../data/T24/T242010.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T24/T242010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t25 <-microO2_import(file = "../data/T25/T252010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)151 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T25/T252010.txt' file 2 2 <NA> 31 columns 30 columns '../data/T25/T252010.txt' row 3 3 <NA> 31 columns 30 columns '../data/T25/T252010.txt' col 4 4 <NA> 31 columns 30 columns '../data/T25/T252010.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T25/T252010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t26 <-microO2_import(file = "../data/T26/T262010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)153 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T26/T262010.txt' file 2 2 <NA> 31 columns 30 columns '../data/T26/T262010.txt' row 3 3 <NA> 31 columns 30 columns '../data/T26/T262010.txt' col 4 4 <NA> 31 columns 30 columns '../data/T26/T262010.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T26/T262010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t27 <-microO2_import(file = "../data/T27/T272010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)219 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T27/T272010.txt' file 2 2 <NA> 31 columns 30 columns '../data/T27/T272010.txt' row 3 3 <NA> 31 columns 30 columns '../data/T27/T272010.txt' col 4 4 <NA> 31 columns 30 columns '../data/T27/T272010.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T27/T272010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t28 <-microO2_import(file = "../data/T28/T282010.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)219 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T28/T282010.txt' file 2 2 <NA> 31 columns 30 columns '../data/T28/T282010.txt' row 3 3 <NA> 31 columns 30 columns '../data/T28/T282010.txt' col 4 4 <NA> 31 columns 30 columns '../data/T28/T282010.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T28/T282010.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
ggplot(t23)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red", alpha = 0.5)

ggplot(t24)+
geom_line(mapping = aes(x = time, y = O2))+
annotate("rect", xmin = 3, xmax = 15, ymin = 8, ymax = 10, alpha = .2) +
annotate("rect", xmin = 20, xmax = 35, ymin = 8, ymax = 10, alpha = .3)+
annotate("rect", xmin = 40, xmax = 55, ymin = 8, ymax = 10, alpha = .4) +
annotate("rect", xmin = 60, xmax = 75, ymin = 8, ymax = 10, alpha = .1, fill = "red")

ggplot(t25)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red", alpha = 0.005)

ggplot(t26)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red", alpha = 0.005)

dist <- data.frame(dist = c(rep("0", 33), rep("0.1", 67), rep("0.2", 53)))
t26_test <- bind_cols(t26, dist)
library(dplyr)
t25%>%filter(O2 < 8 ) ->t26_a
t26%>%filter(O2 < 8 ) ->t26_a
ggplot(t26_a)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red", alpha = 0.005)

ggplot(t27)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red", alpha = 0.005)

ggplot(t28)+
geom_line(mapping = aes(x = time, y = O2))+
geom_rect(xmin = -50, xmax = 50, ymin = 0, ymax = 12, fill = "Red", alpha = 0.005)

- un delta de temps de 25 sec est trop court que pour permettre une stabilisation. ex t23 il faut etre au dela de 300 à 500 \(\mu m\) pour être dehors de l’influence de la production de l’holobionte.
test lumière ON/OFF sur coenosarc
ggplot(t29)+
geom_line(mapping = aes(x = time, y = O2))

# ne donne pas grand chose d'exploitable
ggplot(t30)+
geom_line(mapping = aes(x = time, y = O2))

# ne donne pas grand chose d'exploitable
t31 <-microO2_import(file = "../data/T31/T312710.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)913 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T31/T312710.txt' file 2 2 <NA> 31 columns 30 columns '../data/T31/T312710.txt' row 3 3 <NA> 31 columns 30 columns '../data/T31/T312710.txt' col 4 4 <NA> 31 columns 30 columns '../data/T31/T312710.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T31/T312710.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
t34 <-microO2_import(file = "../data/T34/T342710.txt")
Missing column names filled in: 'X31' [31]Duplicated column names deduplicated: '(\'C)' => '(\'C)_1' [16], 'Ch 1' => 'Ch 1_1' [18], 'Ch 2' => 'Ch 2_1' [19], 'Ch 3' => 'Ch 3_1' [20], 'Ch 4' => 'Ch 4_1' [21], 'Ch1' => 'Ch1_1' [22], 'Ch2' => 'Ch2_1' [23], 'Ch3' => 'Ch3_1' [24], 'Ch4' => 'Ch4_1' [25], 'Ch1' => 'Ch1_2' [26], 'Ch2' => 'Ch2_2' [27], 'Ch3' => 'Ch3_2' [28], 'Ch4' => 'Ch4_2' [29]Parsed with column specification:
cols(
.default = col_character(),
`Time (HH:MM:SS)` = col_time(format = ""),
`Time (s)` = col_double(),
Ch1 = col_double(),
`Ch 1` = col_double(),
`(mbar)` = col_double(),
`(%)` = col_double(),
`Ch 1_1` = col_double(),
Ch1_1 = col_double(),
Ch1_2 = col_double()
)
See spec(...) for full column specifications.
number of columns of result is not a multiple of vector length (arg 1)647 parsing failures.
row # A tibble: 5 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 1 <NA> 31 columns 30 columns '../data/T34/T342710.txt' file 2 2 <NA> 31 columns 30 columns '../data/T34/T342710.txt' row 3 3 <NA> 31 columns 30 columns '../data/T34/T342710.txt' col 4 4 <NA> 31 columns 30 columns '../data/T34/T342710.txt' expected 5 5 <NA> 31 columns 30 columns '../data/T34/T342710.txt'
... ................. ... ............................................................. ........ ............................................................. ...... ............................................................. .... ............................................................. ... ............................................................. ... ............................................................. ........ .............................................................
See problems(...) for more details.
library(tidyverse)
ggplot(t31)+
geom_line(mapping = aes(x = time, y = O2))

t31%>%filter(time > 120 , time <200) -> t_test
ggplot(t_test)+
geom_line(mapping = aes(x = time, y = O2))

ggplot(t_test)+
geom_line(mapping = aes(x = time, y = log(O2)))

library("dplyr")
t_test%>%mutate(log_O2 = log(O2)) ->t_test
summary(lm. <- lm(log_O2 ~ time, data = t_test))
Call:
lm(formula = log_O2 ~ time, data = t_test)
Residuals:
Min 1Q Median 3Q Max
-0.0145563 -0.0112197 -0.0003336 0.0088456 0.0259999
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.0235323 0.0109269 276.7 <2e-16 ***
time -0.0062713 0.0000678 -92.5 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01135 on 51 degrees of freedom
Multiple R-squared: 0.9941, Adjusted R-squared: 0.994
F-statistic: 8555 on 1 and 51 DF, p-value: < 2.2e-16
lm. %>% (function(lm, model = lm[["model"]], vars = names(model))
ggplot(model, aes_string(x = vars[2], y = vars[1])) +
geom_point() + stat_smooth(method = "lm", formula = y ~ x))

lm. %>% qplot(.fitted, .resid, data = .) +
geom_hline(yintercept = 0) +
geom_smooth(se = FALSE) +
xlab("Fitted values") +
ylab("Residuals") +
ggtitle("Residuals vs Fitted")

#plot(lm., which = 2)
lm. %>% qplot(sample = .stdresid, data = .) +
geom_abline(intercept = 0, slope = 1, colour = "darkgray") +
xlab("Theoretical quantiles") +
ylab("Standardized residuals") +
ggtitle("Normal Q-Q")

#plot(lm., which = 3)
lm. %>% qplot(.fitted, sqrt(abs(.stdresid)), data = .) +
geom_smooth(se = FALSE) +
xlab("Fitted values") +
ylab(expression(bold(sqrt(abs("Standardized residuals"))))) +
ggtitle("Scale-Location")

ggplot(t34)+
geom_line(mapping = aes(x = time, y = O2))

ggplot(t35)+
geom_line(mapping = aes(x = time, y = O2))

#ggplot(t36)+
# geom_line(mapping = aes(x = time, y = O2))
ggplot(t37)+
geom_line(mapping = aes(x = time, y = O2))

ggplot(t38)+
geom_line(mapping = aes(x = time, y = O2))

ggplot(t39)+
geom_line(mapping = aes(x = time, y = O2))

L’expérience recommence à zéro
Après s’être apperçu que l’on déplaçait la sonde de 1mm au lieu de 100 \(\mu m\), on relance l’expérience
t40 <-microO2_import2(file = "../data/T40/T40.txt")
t42 <-microO2_import2(file = "../data/T42/T420311.txt")
library(tidyverse)
ggplot(t40)+
geom_line(mapping = aes(x = temps, y = O2))

Première critique de l’expérience, on peut observer que nous avons une première partie du graphique continu sur environ 300 seconde ( et donc \(200 \mu m\))qui pourrait être interprété comme une couche d’eau stagnante entourant le corail. L’étape suivante est de réaliser à nouveau cette expérience et de la faire dans le sens contraire pour avancer vers le corail
t42%>%filter(temps < 720)->t42
ggplot(t42)+
geom_line(mapping = aes(x = temps, y = O2))+
geom_vline(xintercept = c(500, 720))

Première remarque sur l’expérience en partant du milieu et en avancant vers le coenosarc, on observe un augmentation progressive de l’oxygène puis on atteint un premier plateau lorsque la sonde touche le coenosarc et que la concentration réaugmente lorsque l’on touche pénetre les tissus. Il semble cependat qu’un sorte de couche stable se situa à proximité du coenosarc ( touche au visuelle à 500 secondes)
t43 <-microO2_import2(file = "../data/T43/T430311.txt")
t43$num <-as.numeric(t43$Date)
library(readr)
library(tidyverse)
T430311_light <- read_csv("../data/T43/T430311_light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
T430311_light%>%rename(Date = time)->T430311_light
T430311_light$num <-as.numeric(T430311_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t43_test <- left_join(t43, T430311_light, by = "num")
#View(T430311_light)
library(lubridate)
Attachement du package : ‘lubridate’
The following object is masked from ‘package:base’:
date
T430311_light %>% separate(col = Date,into = c("year", "hour"), sep = " ", remove = FALSE) -> T430311_light
t43 %>% separate(col = Date,into = c("year", "hour"), sep = " ", remove = FALSE) -> t43
t43_test <- left_join(t43, T430311_light, by = "hour")
t43_test %>% fill(light , .direction = "down")->t43_test
t43_test$light[is.na(t43_test$light)] <- 1
t43_test$light <- as.factor(t43_test$light)
ggplot(data = t43_test, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1)) +
theme_bw()

t45 <-microO2_import2(file = "../data/T45/T450711.txt")
t46 <-microO2_import2(file = "../data/T46/T460711.txt")
t45 <-microO2_import2(file = "../data/T45/T450711.txt")
t53 <-microO2_import2(file = "../data/T53/T531011.txt")
t54 <-microO2_import2(file = "../data/T54/T541011.txt")
t55 <-microO2_import2(file = "../data/T55/T551011.txt")
t57 <-microO2_import2(file = "../data/T57/T571311.txt")
t58 <-microO2_import2(file = "../data/T58/T581311.txt")
t60 <-microO2_import2(file = "../data/T60/T601311.txt")
t61 <-microO2_import2(file = "../data/T61/T611311.txt")
library(tidyverse)
ggplot(t45)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t46)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t53)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t54)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t55)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t57)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t58)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t60)+
geom_line(mapping = aes(x = temps, y = O2))

ggplot(t61)+
geom_line(mapping = aes(x = temps, y = O2))+
theme_bw()

Expérience du 11 décembre 2017
- Utilisation de la nouvelle sonde à électrode
On observe que l’utilisation d’une nouvelle microélectrode permet d’obtenir un signal plus nette.
Experience 70
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t70 <-microO2_import2(file = "../data/T70/T701112.txt")
#creation d'une nouvelle variable en character
t70$time <-as.character(t70$Date)
#importation et transfo de la date
T70_light <- read_csv("../data/T70/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
T70_light%>%rename(Date = time)->T70_light
T70_light$time <- as.character(T70_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t70_comb <- left_join(t70, T70_light, by = "time")
t70_comb %>% fill(light , .direction = "down")->t70_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t70_comb$light[is.na(t70_comb$light)] <- 1
t70_comb$light <- as.factor(t70_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t70_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

- On a un beau signal
- On peut réduire le temps avant de débuter la manip à 20 secondes et plus 50 secondes
- On peut réduire le temps d’éclairage à 15 secondes et plus 30 secondes
71
- perte du fichier sur la lumière
#importation
t71 <-microO2_import2(file = "../data/T71/T711112.txt")
ggplot(data = t71, mapping = aes(x = temps, y = O2))+
geom_line()

72
- Il y a un probleme entre l’eclairage et la microélectrode à voir
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t72 <-microO2_import2(file = "../data/t72/t721112.txt")
#creation d'une nouvelle variable en character
t72$time <-as.character(t72$Date)
#importation et transfo de la date
t72_light <- read_csv("../data/t72/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
t72_light%>%rename(Date = time)->t72_light
t72_light$time <- as.character(t72_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t72_comb <- left_join(t72, t72_light, by = "time")
t72_comb %>% fill(light , .direction = "down")->t72_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t72_comb$light[is.na(t72_comb$light)] <- 1
t72_comb$light <- as.factor(t72_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t72_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t73 <-microO2_import2(file = "../data/t73/t731112.txt")
#creation d'une nouvelle variable en character
t73$time <-as.character(t73$Date)
#importation et transfo de la date
t73_light <- read_csv("../data/t73/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
t73_light%>%rename(Date = time)->t73_light
t73_light$time <- as.character(t73_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t73_comb <- left_join(t73, t73_light, by = "time")
t73_comb %>% fill(light , .direction = "down")->t73_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t73_comb$light[is.na(t73_comb$light)] <- 1
t73_comb$light <- as.factor(t73_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t73_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

t74
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t74 <-microO2_import2(file = "../data/t74/t741112.txt")
#creation d'une nouvelle variable en character
t74$time <-as.character(t74$Date)
#importation et transfo de la date
t74_light <- read_csv("../data/t74/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
t74_light%>%rename(Date = time)->t74_light
t74_light$time <- as.character(t74_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t74_comb <- left_join(t74, t74_light, by = "time")
t74_comb %>% fill(light , .direction = "down")->t74_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t74_comb$light[is.na(t74_comb$light)] <- 1
t74_comb$light <- as.factor(t74_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t74_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

t75
- erreur sur la représentation graphique , je ne vois pas comment corriger cela
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t75 <-microO2_import2(file = "../data/t75/t751112.txt")
#creation d'une nouvelle variable en character
t75$time <-as.character(t75$Date)
#importation et transfo de la date
t75_light <- read_csv("../data/t75/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
t75_light%>%rename(Date = time)->t75_light
t75_light%>%mutate(Date = Date + 1) -> t75_light
t75_light$time <- as.character(t75_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t75_comb <- left_join(t75, t75_light, by = "time")
t75_comb %>% fill(light , .direction = "down")->t75_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t75_comb$light[is.na(t75_comb$light)] <- 1
t75_comb$light <- as.factor(t75_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t75_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

t76
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t76 <-microO2_import2(file = "../data/t76/t761112.txt")
#creation d'une nouvelle variable en character
t76$time <-as.character(t76$Date)
#importation et transfo de la date
t76_light <- read_csv("../data/t76/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
t76_light%>%rename(Date = time)->t76_light
#t76_light%>%mutate(Date = Date + 1) -> t76_light
t76_light$time <- as.character(t76_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t76_comb <- left_join(t76, t76_light, by = "time")
t76_comb %>% fill(light , .direction = "down")->t76_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t76_comb$light[is.na(t76_comb$light)] <- 1
t76_comb$light <- as.factor(t76_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t76_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

t77
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t77 <-microO2_import2(file = "../data/t77/t771112.txt")
#creation d'une nouvelle variable en character
t77$time <-as.character(t77$Date)
#importation et transfo de la date
t77_light <- read_csv("../data/t77/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
t77_light%>%rename(Date = time)->t77_light
#t77_light%>%mutate(Date = Date + 1) -> t77_light
t77_light$time <- as.character(t77_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t77_comb <- left_join(t77, t77_light, by = "time")
t77_comb %>% fill(light , .direction = "down")->t77_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t77_comb$light[is.na(t77_comb$light)] <- 1
t77_comb$light <- as.factor(t77_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t77_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

t78
- Je n’ai pas de fichier sur la lumière
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t78 <-microO2_import2(file = "../data/t78/t781112.txt")
#creation d'une nouvelle variable en character
t78$time <-as.character(t78$Date)
#importation et transfo de la date
t78_light <- read_csv("../data/t78/light.csv")
Erreur : '../data/t78/light.csv' does not exist in current working directory ('/Users/engels/Documents/garrido_jessica_memoire_2017_2018/analyse_micro_elect/rapports').
Expérience du 12 décembre 2017
t79
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t79 <-microO2_import2(file = "../data/t79/t791212.txt")
#creation d'une nouvelle variable en character
t79$time <-as.character(t79$Date)
#importation et transfo de la date
t79_light <- read_csv("../data/t79/light.csv")
Parsed with column specification:
cols(
time = col_datetime(format = ""),
light = col_integer()
)
t79_light%>%rename(Date = time)->t79_light
#t79_light%>%mutate(Date = Date + 1) -> t79_light
t79_light$time <- as.character(t79_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t79_comb <- left_join(t79, t79_light, by = "time")
t79_comb %>% fill(light , .direction = "down")->t79_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t79_comb$light[is.na(t79_comb$light)] <- 1
t79_comb$light <- as.factor(t79_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t79_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))

t80
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t80 <-microO2_import2(file = "../data/t80/t801212.txt")
#creation d'une nouvelle variable en character
t80$time <-as.character(t80$Date)
#importation et transfo de la date
t80_light <- read_csv("../data/t80/light.csv")
t80_light%>%rename(Date = time)->t80_light
#t80_light%>%mutate(Date = Date + 1) -> t80_light
t80_light$time <- as.character(t80_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t80_comb <- left_join(t80, t80_light, by = "time")
t80_comb %>% fill(light , .direction = "down")->t80_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t80_comb$light[is.na(t80_comb$light)] <- 1
t80_comb$light <- as.factor(t80_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t80_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))
t81

t82
#package employé durant l'analyse
library(readr)
library(tidyverse)
#importation
t82 <-microO2_import2(file = "../data/t82/t821212.txt")
#creation d'une nouvelle variable en character
t82$time <-as.character(t82$Date)
#importation et transfo de la date
t82_light <- read_csv("../data/t82/light.csv")
t82_light%>%rename(Date = time)->t82_light
#t82_light%>%mutate(Date = Date + 1) -> t82_light
t82_light$time <- as.character(t82_light$Date)
#objectif faire coller le document sur le temps et le document sur l'éclairage
t82_comb <- left_join(t82, t82_light, by = "time")
t82_comb %>% fill(light , .direction = "down")->t82_comb
#probleme spécifique à ce jeu de données
#petite correction supplémentaires car jessica a d'abord lancé le programme de lumière avant l'enregistrement de la sond
t82_comb$light[is.na(t82_comb$light)] <- 1
t82_comb$light <- as.factor(t82_comb$light)
# petit graphique des données avec la lumière
ggplot(data = t82_comb, mapping = aes(x = temps, y = O2, color = light))+
geom_line(aes(group = 1))
t87 Vérification du profil en oxygène
t87 <-microO2_import2(file = "../data/t87/t871912.txt")
library(tidyverse)
ggplot(t87, mapping = aes(x = temps, y = O2))+
geom_line()

(max(t87$temps))/15
[1] 12.96133
N <- 10
pas_de_distance <- 40
distance_initiale <- -400
pas_de_temps <- 15
temps_initiale <-26
n <-c(0:N)
dist <- data_frame(n = n)
dist%>% mutate(temps = (n*pas_de_temps)+temps_initiale)->dist
dist%>%mutate(distance = (n*pas_de_distance)+distance_initiale)->dist
t87$temps <- round(t87$temps, digits = 0)
t87<- left_join(t87, dist, by = "temps")
t87 <- tidyr::fill(t87, distance, .direction = "down")
ggplot(t87, mapping = aes(x = distance, y = O2))+
geom_line()+
geom_smooth()

t88 Vérifiaction du profil suite de t77
library(tidyverse)
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ------------------------------------------------------------------------------
filter(): dplyr, stats
lag(): dplyr, stats
t89 variation de l’intensité de la lumière

LS0tCnRpdGxlOiAiQW5hbHlzZSBkZXMgcsOpc3VsdGF0cyBvYnRlbnVzIGF2ZWMgbGEgbWljcm8tw6lsZWN0cm9kZSDDoCBveHlnw6huZSIKYXV0aG9yOiAiSmVzc2ljYSBTYXZlIEdhcnJpZG8gJiBFbmdlbHMgR3V5bGlhbm4iCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKYWJzdHJhY3Q6IFRyYWl0ZW1lbnQgZ8OpbsOpcmF1eCBkZSBsJ2Vuc2VtYmxlIGRlcyBhbmFseXNlcyByw6lhbGlzw6llcyBkYW5zIGxlIGNhZHJlIGR1CiAgVEZFIGRlIEplc3NpY2EgU2F2ZSBHYXJyaWRvIHBvcnRhbnQgc3VyIGwnaW1wYWN0IGQndW4gc3RyZXNzIHRoZXJtaXF1ZSBzdXIgbGEgcGhvdG9zeW50aMOoc2UKLS0tCgoKCmBgYHtyfQpzb3VyY2UoZmlsZSA9ICIuLi9zY3JpcHRzL21pY3JvX28yX2plc3NpY2FfcGhnLlIiKQpgYGAKCgojIE1pc2UgYXUgcG9pbnQgZGUgbGEgbWljcm8tw6lsZWN0cm9kZSDDoCBveHlnw6huZQoKCiMjIFRlc3QgMSDDoCB0ZXN0IDQgOiBhcHByZW50aXNzYWdlIGRlIGxhIG3DqXRob2RlCgoKKiBEw6lidXQgZGFucyBsJ2VhdSAKKiBBdmFuY8OpZSBwcm9ncmVzc2l2ZSB2ZXJzIGxlIGNvZW5hc2FyYwoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQp0MSA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMS9UMTEyMTAudHh0IikKdDIgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDIvVDIxMjEwLnR4dCIpCnQzIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzL1QzMTIxMC50eHQiKQp0NCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNC9UNDEyMTBfQS50eHQiKQpgYGAKCmBgYHtyfQoKbGlicmFyeSh0aWR5dmVyc2UpCgphIDwtIGdncGxvdChkYXRhID0gdDEpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKwogIHlsaW0oYyg2LDEyKSkKYiA8LSBnZ3Bsb3QoZGF0YSA9IHQyKSArCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpICsKICB5bGltKGMoNiwxMikpCmMgPC0gZ2dwbG90KGRhdGEgPSB0MykgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSArCiAgeWxpbShjKDYsMTIpKQpkIDwtIGdncGxvdChkYXRhID0gdDQpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKwogIHlsaW0oYyg2LDEyKSkKCmxpYnJhcnkoZ2dwdWJyKQoKZ2dhcnJhbmdlKGEsYixjLGQpCmBgYAoKIyBUZXN0IGRlIHJlcHJvZHVjdGliaWxpdMOpCgoqIHLDqWFsaXNlciA0IG1lc3VyZXMgcmVwcm9kdWN0aWJsZSBzdXIgZGlmZsOpcmVudGVzIHpvbmVzIGRlIGxhIGJvdXR1cmUKCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CnQ0YSA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNC9UNDEyMTBfQS50eHQiKQp0NGIgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDQvVDQxMjEwX0IudHh0IikKdDRjIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q0L1Q0MTIxMF9DLnR4dCIpCnQ0ZCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNC9UNDEyMTBfRC50eHQiKQpgYGAKIAogKiAwLTUwIGRhbnMgbCdlYXUKICogNTAtMTI1IHBsYWNlbWVudCBzdXIgbGUgY29lbmFzYXJjCiAqIDEyNS0uLi4gcmV0b3VyIGRhbnMgbCdlYXUKIApgYGB7cn0KCm1vdXYgPC0gYyg1MCwgMTI1KQoKYSA8LSBnZ3Bsb3QoZGF0YSA9IHQ0YSkgKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSArIAogIHlsaW0oNS44LDkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCmIgPC0gZ2dwbG90KGRhdGEgPSB0NGIpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKyAKICB5bGltKDUuOCw5KSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCmMgPC0gZ2dwbG90KGRhdGEgPSB0NGMpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKyAKICB5bGltKDUuOCw5KSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCmQgPC0gZ2dwbG90KGRhdGEgPSB0NGQpICsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKyAKICB5bGltKDUuOCw5KSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCgpnZ2FycmFuZ2UoYSxiLGMsZCwgbGFiZWxzID0gImF1dG8iKQpgYGAKCgojIFRlc3QgNSDDoCB0ZXN0IDEwIDogcHJlbWllciB0ZXN0IHN1ciBsZSBwcm9maWwgw6AgMTAwIFBBUgoKKiBWYXJpYXRpb24gZHUgdGVtcHMgcG91ciBkw6l0ZXJtaW5lciBsZXMgdmFyaWF0aW9ucyBkdSBwcm9maWwKCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CnQ1IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q1L1Q1MTIxMC50eHQiKQp0NiA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UNi9UNjEyMTAudHh0IikKI3Q3IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q3L1Q3MTIxMC50eHQiKQogICNyZWpldGVyIGNhciBlcnJldXIgOiBwYXMgdG9wIGF2ZWMgbW91dmVtZW50IGRlIGxhIG1pY3Jvc29uZGUKdDggPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDgvVDgxMzEwLnR4dCIpCnQ5IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1Q5L1Q5MTMxMC50eHQiKQp0MTAgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDEwL1QxMDEzMTAudHh0IikKI3QxMSA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMTAvVDExMTMxMC50eHQiKQpgYGAKCmBgYHtyfQojZGVwYXJ0IGNvZW5hc2FyYwojNTAwIG1pY3JvIGR1IGNvYW5hc2FyYwptb3V2IDwtYygyNSw1MCw3NSwxMDAsMTI1LDIwMCwyMjUsIDI1MCwgMjc1LCAzNTAsIDM3NSkKYSA8LSBnZ3Bsb3QodDUpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpCgptb3V2IDwtYygyNSw1MCw3NSwxMDAsMTI1LDE1MCwgMTc1LCAyMDAsIDIyNSwgMjUwKQpiIDwtIGdncGxvdCh0NikrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1vdXYsIGNvbG9yID0gbW91dikgIAoKbW91diA8LWMoNTAsMTAwLDE1MCwyMDAsIDI1MCwgMzAwLCAzNTAsIDQwMCwgNDUwLCA1MDAsIDU1MCkKYyA8LWdncGxvdCh0OCkrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1vdXYsIGNvbG9yID0gbW91dikgCgptb3V2IDwtYyg1MCwxMDAsMTUwLDIwMCwgMjUwLCAzMDAsIDM1MCwgNDAwLCA0NTAsIDUwMCwgNTUwKQpkIDwtZ2dwbG90KHQ5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbW91diwgY29sb3IgPSBtb3V2KSAKCm1vdXYgPC1jKDEwMCwyMDAsMzAwLCA0MDAsIDU1MCkKZSA8LSBnZ3Bsb3QodDEwKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbW91diwgY29sb3IgPSBtb3V2KSAKCmdnYXJyYW5nZShhLGIsYyxkLGUsIG5jb2wgPSAyLCBucm93ID0gMywgbGFiZWxzID0gImF1dG8iKQpgYGAKCiMgVGVzdDEyIDogcHJlbWllciBwcm9maWwgMCBQQVIKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDEyIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QxMi9UMTIxMzEwLnR4dCIpCmBgYAoKCiogQWRhcHRhdGlvbiA1IG1pbiBkYW5zIGxlIG5vaXIKKiBkZXBhcnQgY29lbmFzYXJjIAoqIGZpbiAxMDAgJFxtdSBtJCAKCgpgYGB7cn0KI21vdXYgPC1jKDEwMCwyMDAsMzAwLCA0MDAsIDUwMCkKI3N1bW1hcnkodDEyKQphIDwtIGdncGxvdCh0MTIsbWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV9saW5lKCkgKwogIHhsaW0gKGMoMCw1NTApKSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAwLCB4bWF4ID0gMTAwLCB5bWluID0gMCwgeW1heCA9IDksIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMjAwLCB4bWF4ID0gMzAwLCB5bWluID0gMCwgeW1heCA9IDksIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gNDAwLCB4bWF4ID0gNTAwLCB5bWluID0gMCwgeW1heCA9IDksIGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjAwNSkrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gYyg1MCwgMjUwLCA0NTApLCB5ID0gNC41LCBsYWJlbCA9ICIwIG1tIikgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoMTUwLCAzNTAsIDUzMCksIHkgPSA0LjUsIGxhYmVsID0gIiArIDAuMSBtbSIpKwogIGxhYnMoeCA9ICJPeHlnw6huZSBkaXNzb3VzIChtZy9MKSIsIHkgPSAiVGVtcHMgKHMpIiwgY2FwdGlvbiA9ICJWYXJpYXRpb24gZGUgbCdveHlnw6huZSBkaXNzb3VzIGRhbnMgbCdlYXUgbWVzdXLDqWUgYXZlYyB1bmUgbWljcm/DqWxlY3Ryb2RlIMOgIG94eWfDqG5lIHBsYWPDqWUgXG4gc3VyIGxlIGNvZW5vc2FyYyAoMCBtbSkgZXQgZGlzdGFudCBkZSBjZSBkZXJuaWVyICgwLjFtbSkgZGFucyBsJ29ic2N1cml0w6kiKSsKICB0aGVtZShwbG90LmNhcHRpb24gID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYQojZ2dzYXZlKGZpbGVuYW1lID0gInRlc3QxMi5wbmciLCBwbG90ID0gYSwgZGV2aWNlID0gInBuZyIpCmBgYAoKKiBVdGlsaXNhdGlvbiBwb3RlbnRpZWwgcG91ciByw6lhbGlzZXIgZGVzIHLDqWdyZXNzaW9ucyBsaW7DqWFpcmVzCgoKIyBUZXN0IDEzIMOgIHRlc3QgMTUgCgoqaWRlbSBtYW5pcCB0ZXN0NSDDoCB0ZXN0MTAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDEzIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QxMy9UMTMxODEwLnR4dCIpCnQxNCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMTQvVDE0MTgxMC50eHQiKQp0MTUgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDE1L1QxNTE4MTAudHh0IikKYGBgCmBgYHtyfQptb3V2IDwtYyg1MCwgMTAwLCAxNTAgLDIwMCwgMjI1LCAyNTAsIDM1MCwgNDAwKQphIDwtIGdncGxvdCh0MTMpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpIAptb3V2IDwtYyg1MCwgMTAwLCAxNTAgLDIwMCwgMjUwKQpiIDwtIGdncGxvdCh0MTQpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtb3V2LCBjb2xvciA9IG1vdXYpIAoKbW91diA8LWMoNTAsIDEwMCwgMTI1LCAxNzUgLDIyNSkKYyA8LSBnZ3Bsb3QodDE1KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbW91diwgY29sb3IgPSBtb3V2KSAKCmdnYXJyYW5nZShhLGIsYywgbGFiZWxzID0gImF1dG8iKQpgYGAKCiogbG9ycyBkdSBwbGFjZW1lbnQgc3VyIGxlIGNvZW5hc2FyYywgb24gbidvYnRpZW5zIHBhcyBkZXV4IHN1Y2Nlc3NpdmVtZW50cyBsZXMgbcOqbWVzIGRvbm7DqWVzCgoKIyBUZXN0MTYgIDogcHJlbWllciB0ZXN0IGx1bWnDqHJlIG9uL29mZgoKKiBzb25kZSBwbGFjw6llIHN1ciBsZSBjb2VuYXNhcmMKKiB0ZW1wcyBub24gZMOpdGVybWluw6kgbWFpcyBzdXIgcGxhdGVhdSBncmFwaGlxdWUgZHUgcHJvZ3JhbW1lIGRlIGxhIHNvbmRlIAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQp0MTYgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDE2L1QxNjE4MTAudHh0IikKYGBgCgoKYGBge3J9CmdncGxvdCh0MTYpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInJlZCIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDI3NSwgeG1heCA9IDUyNSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJyZWQiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSA1MCwgeG1heCA9IDI3NSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJibHVlIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gNTI1LCB4bWF4ID0gMTAwMCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJibHVlIiwgIGFscGhhID0gMC4wMDUpKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoMTc1LCA2NTApLCB5ID0gMy44LCBsYWJlbCA9ICIwIFBBUiIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSBjKDAsIDQwMCksIHkgPSAzLjgsIGxhYmVsID0gIiAxMDAgUEFSIikgKwogIGxhYnMoeCA9ICJPeHlnw6huZSBkaXNzb3VzIChtZy9MKSIsIHkgPSAiVGVtcHMgKHMpIiwgY2FwdGlvbiA9ICJWYXJpYXRpb24gZGUgbCdveHlnw6huZSBkaXNzb3VzIG1lc3Vyw6llIGF2ZWMgdW5lIG1pY3Jvw6lsZWN0cm9kZSDDoCBveHlnw6huZSBwbGFjw6llIFxuIHN1ciBsZSBjb2Vub3NhcmMgbG9ycyBkZSBsJ2V4cG9zaXRpb24gw6AgMCBQQVIgKGJsZXUpIGV0IDEwMCBQQVIgKHJvdWdlKSIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiAgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQojZ2dzYXZlKGZpbGVuYW1lID0gInRlc3QxNi5wbmciLCBkZXZpY2UgPSAicG5nIikKYGBgCgojIFRlc3QgMTcKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDE3IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QxNy9UMTcyMDEwLnR4dCIpCgp0MTkgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDE5L1QxOTIwMTAudHh0IikKCnQyMCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMjAvVDIwMjAxMC50eHQiKQoKdDIxIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyMS9UMjEyMDEwLnR4dCIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QodDE3KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkgKwogIGdlb21fcmVjdCh4bWluID0gLTUwLCB4bWF4ID0gMTI1LCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInJlZCIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDEyNSwgeG1heCA9IDE1MCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJibHVlIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTUwLCB4bWF4ID0gMTc1LCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gImdyZWVuIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTc1LCB4bWF4ID0gMjAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gImJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAyMDAsIHhtYXggPSAzMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMzAwLCB4bWF4ID0gMzI1LCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gImJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzMjUsIHhtYXggPSAzNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiZ3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSAzNzUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiYmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDM3NSwgeG1heCA9IDEwMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAicmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGxhYnMoeCA9ICJPeHlnw6huZSBkaXNzb3VzIChtZy9MKSIsIHkgPSAiVGVtcHMgKHMpIiwgY2FwdGlvbiA9ICJWYXJpYXRpb24gZGUgbCdveHlnw6huZSBkaXNzb3VzIG1lc3Vyw6llIGF2ZWMgdW5lIG1pY3Jvw6lsZWN0cm9kZSDDoCBveHlnw6huZSBwbGFjw6llIFxuIHN1ciBsZSBjb2Vub3NhcmMgKHJvdWdlKSwgw6AgMC4xIG1tIChibGV1KSwgMC4yIG1tICh2ZXJ0KSBkZSBjZSBkZXJuaWVyIMOgIDEwMCBQQVIuIikrCiAgdGhlbWUocGxvdC5jYXB0aW9uICA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCiAgCgoKYGBgCgpgYGB7cn0KYSA8LSBnZ3Bsb3QodDE5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAtNTAsIHhtYXggPSAxMjUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiUmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTI1LCB4bWF4ID0gMTUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIkJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAxNTAsIHhtYXggPSAxNzUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiR3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAxNzUsIHhtYXggPSAyMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMjAwLCB4bWF4ID0gMzUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInB1cnBsZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSAzNzUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpICsKICBnZW9tX3JlY3QoeG1pbiA9IDM3NSwgeG1heCA9IDQwMCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJHcmVlbiIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSA0MDAsIHhtYXggPSA0MjUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsgCiAgZ2VvbV9yZWN0KHhtaW4gPSA0MjUsIHhtYXggPSAxMDAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KSArCiAgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiKQpiIDwtIGdncGxvdCh0MjApKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDEyNSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJSZWQiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAxMjUsIHhtYXggPSAxNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDE1MCwgeG1heCA9IDE3NSwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJHcmVlbiIsICBhbHBoYSA9IDAuMDA1KSsKICBnZW9tX3JlY3QoeG1pbiA9IDE3NSwgeG1heCA9IDMwMCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJZZWxsb3ciLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzMDAsIHhtYXggPSAzMjUsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiR3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAzMjUsIHhtYXggPSAzNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSAxMDAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KSArCiAgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiKQoKbGlicmFyeShnZ3B1YnIpCiBhIDwtIGdnYXJyYW5nZShhLGIsIG5jb2wgPSAyLCBsYWJlbHMgPSAiYXV0byIpCiBhICsgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiLCBjYXB0aW9uID0gIlZhcmlhdGlvbiBkZSBsJ294eWfDqG5lIGRpc3NvdXMgbWVzdXLDqWUgYXZlYyB1bmUgbWljcm/DqWxlY3Ryb2RlIMOgIG94eWfDqG5lIHBsYWPDqWUgXG4gc3VyIGxlIGNvZW5vc2FyYyAocm91Z2UpLCDDoCAwLjEgbW0gKGJsZXUpLCAwLjIgbW0gKHZlcnQpLCAwLjMgbW0gKGphdW5lKSBldCAwLjQgKG1hdXZlKSBkZSBjZSBkZXJuaWVyIMOgIDEwMCBQQVIsIFxuIHN1ciB1bmUgem9uZSBmb3J0ZW1lbnQgcGlnbWVudMOpZSAoQSkgZXQgZmFpYmxlbWVudCBwaWdtZW50w6llIChCKS4iKSsKICB0aGVtZShwbG90LmNhcHRpb24gID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTApKSAKYGBgCgoKCmBgYHtyfQpnZ3Bsb3QodDIxKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAtNTAsIHhtYXggPSAxNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiUmVkIiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMTUwLCB4bWF4ID0gMjAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIkJsdWUiLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAyMDAsIHhtYXggPSAyNTAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiR3JlZW4iLCAgYWxwaGEgPSAwLjAwNSkrCiAgZ2VvbV9yZWN0KHhtaW4gPSAyNTAsIHhtYXggPSAzMDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpKwogIGdlb21fcmVjdCh4bWluID0gMzAwLCB4bWF4ID0gMzUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInB1cnBsZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSAzNTAsIHhtYXggPSA1MDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAic2t5IGJsdWUiLCAgYWxwaGEgPSAwLjAwNSkgKwogIGdlb21fcmVjdCh4bWluID0gNTAwLCB4bWF4ID0gNTUwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gInB1cnBsZSIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSA1NTAsIHhtYXggPSA2MDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiWWVsbG93IiwgIGFscGhhID0gMC4wMDUpICsKICBnZW9tX3JlY3QoeG1pbiA9IDYwMCwgeG1heCA9IDY1MCwgeW1pbiA9IDAsIHltYXggPSAxMCwgZmlsbCA9ICJHcmVlbiIsICBhbHBoYSA9IDAuMDA1KSArCiAgZ2VvbV9yZWN0KHhtaW4gPSA2NTAsIHhtYXggPSA3MDAsIHltaW4gPSAwLCB5bWF4ID0gMTAsIGZpbGwgPSAiQmx1ZSIsICBhbHBoYSA9IDAuMDA1KSsgCiAgZ2VvbV9yZWN0KHhtaW4gPSA3MDAsIHhtYXggPSAxMDAwLCB5bWluID0gMCwgeW1heCA9IDEwLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KSArCiAgbGFicyh4ID0gIk94eWfDqG5lIGRpc3NvdXMgKG1nL0wpIiwgeSA9ICJUZW1wcyAocykiKQojdDIyIG9uIGxhaXNzZSBzdXIgbGUgY290w6kgY2FyIGRlbWFuZGUgYmNwIGRlIHRlbXBzIHBvdXIgdW5lIHLDqXN1bHRhdCBxdWkgbW9udHJlIHF1ZSBhdSBib3V0IGRlIDUwIHNlYyDDoCAwLjEgb24gYSBwYXMgYXR0ZWludCBsZSBwbGF0ZWF1IApgYGAKCgojIHRlc3QgZGlzdGFuY2UgcGFyIHJhcHBvcnQgYXUgY29lbm9zYXJjCgpgYGB7cn0KdDIzIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyMy9UMjMyMDEwLnR4dCIpCnQyNCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMjQvVDI0MjAxMC50eHQiKQp0MjUgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDI1L1QyNTIwMTAudHh0IikKdDI2IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyNi9UMjYyMDEwLnR4dCIpCnQyNyA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMjcvVDI3MjAxMC50eHQiKQp0MjggPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDI4L1QyODIwMTAudHh0IikKYGBgCgpgYGB7cn0KZ2dwbG90KHQyMykrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuNSkKCmdncGxvdCh0MjQpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAzLCB4bWF4ID0gMTUsIHltaW4gPSA4LCB5bWF4ID0gMTAsIGFscGhhID0gLjIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAyMCwgeG1heCA9IDM1LCB5bWluID0gOCwgeW1heCA9IDEwLCBhbHBoYSA9IC4zKSsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSA0MCwgeG1heCA9IDU1LCB5bWluID0gOCwgeW1heCA9IDEwLCBhbHBoYSA9IC40KSArCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gNjAsIHhtYXggPSA3NSwgeW1pbiA9IDgsIHltYXggPSAxMCwgYWxwaGEgPSAuMSwgZmlsbCA9ICJyZWQiKQoKZ2dwbG90KHQyNSkrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KQoKZ2dwbG90KHQyNikrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KQoKZGlzdCA8LSBkYXRhLmZyYW1lKGRpc3QgPSAgYyhyZXAoIjAiLCAzMyksIHJlcCgiMC4xIiwgNjcpLCByZXAoIjAuMiIsIDUzKSkpCnQyNl90ZXN0IDwtIGJpbmRfY29scyh0MjYsIGRpc3QpCgoKCgoKbGlicmFyeShkcGx5cikKCnQyNSU+JWZpbHRlcihPMiA8IDggKSAtPnQyNl9hCnQyNiU+JWZpbHRlcihPMiA8IDggKSAtPnQyNl9hCgoKZ2dwbG90KHQyNl9hKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkrIAogIGdlb21fcmVjdCh4bWluID0gLTUwLCB4bWF4ID0gNTAsIHltaW4gPSAwLCB5bWF4ID0gMTIsIGZpbGwgPSAiUmVkIiwgIGFscGhhID0gMC4wMDUpCgoKZ2dwbG90KHQyNykrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpKyAKICBnZW9tX3JlY3QoeG1pbiA9IC01MCwgeG1heCA9IDUwLCB5bWluID0gMCwgeW1heCA9IDEyLCBmaWxsID0gIlJlZCIsICBhbHBoYSA9IDAuMDA1KQoKCmdncGxvdCh0MjgpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKSsgCiAgZ2VvbV9yZWN0KHhtaW4gPSAtNTAsIHhtYXggPSA1MCwgeW1pbiA9IDAsIHltYXggPSAxMiwgZmlsbCA9ICJSZWQiLCAgYWxwaGEgPSAwLjAwNSkKCgpgYGAKCiogdW4gZGVsdGEgZGUgdGVtcHMgZGUgMjUgc2VjIGVzdCB0cm9wIGNvdXJ0IHF1ZSBwb3VyIHBlcm1ldHRyZSB1bmUgc3RhYmlsaXNhdGlvbi4gZXggdDIzIGlsIGZhdXQgZXRyZSAgYXUgZGVsYSBkZSAzMDAgw6AgNTAwICRcbXUgbSQgIHBvdXIgw6p0cmUgZGVob3JzIGRlIGwnaW5mbHVlbmNlIGRlIGxhIHByb2R1Y3Rpb24gZGUgbCdob2xvYmlvbnRlLiAKCgojIHRlc3QgbHVtacOocmUgT04vT0ZGIHN1ciBjb2Vub3NhcmMKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30KdDI5IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QyOS9UMjkyMDEwLnR4dCIpCnQzMCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMzAvVDMwMjAxMC50eHQiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QodDI5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKIyBuZSBkb25uZSBwYXMgZ3JhbmQgY2hvc2UgZCdleHBsb2l0YWJsZQpnZ3Bsb3QodDMwKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKIyBuZSBkb25uZSBwYXMgZ3JhbmQgY2hvc2UgZCdleHBsb2l0YWJsZQpgYGAKCgpgYGB7cn0KdDMxIDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzMS9UMzEyNzEwLnR4dCIpCnQzNCA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMzQvVDM0MjcxMC50eHQiKQpgYGAKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpnZ3Bsb3QodDMxKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKCnQzMSU+JWZpbHRlcih0aW1lID4gMTIwICwgdGltZSA8MjAwKSAtPiB0X3Rlc3QKCmdncGxvdCh0X3Rlc3QpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKQoKZ2dwbG90KHRfdGVzdCkrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBsb2coTzIpKSkKCmxpYnJhcnkoImRwbHlyIikKCnRfdGVzdCU+JW11dGF0ZShsb2dfTzIgPSBsb2coTzIpKSAtPnRfdGVzdApzdW1tYXJ5KGxtLiA8LSBsbShsb2dfTzIgfiB0aW1lLCBkYXRhID0gdF90ZXN0KSkKCgpsbS4gJT4lIChmdW5jdGlvbihsbSwgbW9kZWwgPSBsbVtbIm1vZGVsIl1dLCB2YXJzID0gbmFtZXMobW9kZWwpKQogIGdncGxvdChtb2RlbCwgYWVzX3N0cmluZyh4ID0gdmFyc1syXSwgeSA9IHZhcnNbMV0pKSArCiAgICBnZW9tX3BvaW50KCkgKyBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgpKQoKbG0uICU+JSBxcGxvdCguZml0dGVkLCAucmVzaWQsIGRhdGEgPSAuKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpICsKICB4bGFiKCJGaXR0ZWQgdmFsdWVzIikgKwogIHlsYWIoIlJlc2lkdWFscyIpICsKICBnZ3RpdGxlKCJSZXNpZHVhbHMgdnMgRml0dGVkIikKCiNwbG90KGxtLiwgd2hpY2ggPSAyKQpsbS4gJT4lIHFwbG90KHNhbXBsZSA9IC5zdGRyZXNpZCwgZGF0YSA9IC4pICsKICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsIGNvbG91ciA9ICJkYXJrZ3JheSIpICsKICB4bGFiKCJUaGVvcmV0aWNhbCBxdWFudGlsZXMiKSArCiAgeWxhYigiU3RhbmRhcmRpemVkIHJlc2lkdWFscyIpICsKICBnZ3RpdGxlKCJOb3JtYWwgUS1RIikKCiNwbG90KGxtLiwgd2hpY2ggPSAzKQpsbS4gJT4lIHFwbG90KC5maXR0ZWQsIHNxcnQoYWJzKC5zdGRyZXNpZCkpLCBkYXRhID0gLikgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UpICsKICB4bGFiKCJGaXR0ZWQgdmFsdWVzIikgKwogIHlsYWIoZXhwcmVzc2lvbihib2xkKHNxcnQoYWJzKCJTdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIikpKSkpICsKICBnZ3RpdGxlKCJTY2FsZS1Mb2NhdGlvbiIpCgpnZ3Bsb3QodDM0KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQp0MzUgPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDM1L1QzNTI3MTAudHh0IikKdDM2IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzNi9UMzYyNzEwLnR4dCIpCnQzNyA8LW1pY3JvTzJfaW1wb3J0KGZpbGUgPSAiLi4vZGF0YS9UMzcvVDM3MjcxMC50eHQiKQp0MzggPC1taWNyb08yX2ltcG9ydChmaWxlID0gIi4uL2RhdGEvVDM4L1QzODI3MTAudHh0IikKdDM5IDwtbWljcm9PMl9pbXBvcnQoZmlsZSA9ICIuLi9kYXRhL1QzOS9UMzkyNzEwLnR4dCIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QodDM1KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKI2dncGxvdCh0MzYpKwojICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKZ2dwbG90KHQzNykrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRpbWUsIHkgPSBPMikpCmdncGxvdCh0MzgpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0aW1lLCB5ID0gTzIpKQpnZ3Bsb3QodDM5KSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGltZSwgeSA9IE8yKSkKCmBgYAoKIyBMJ2V4cMOpcmllbmNlIHJlY29tbWVuY2Ugw6AgesOpcm8KCkFwcsOocyBzJ8OqdHJlIGFwcGVyw6d1IHF1ZSBsJ29uIGTDqXBsYcOnYWl0IGxhIHNvbmRlIGRlIDFtbSBhdSBsaWV1IGRlIDEwMCAkXG11IG0kLCBvbiByZWxhbmNlIGwnZXhww6lyaWVuY2UKCmBgYHtyfQp0NDAgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q0MC9UNDAudHh0IikKCnQ0MiA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDQyL1Q0MjAzMTEudHh0IikKbGlicmFyeSh0aWR5dmVyc2UpCmdncGxvdCh0NDApKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmBgYAoKUHJlbWnDqHJlIGNyaXRpcXVlIGRlIGwnZXhww6lyaWVuY2UsIG9uIHBldXQgb2JzZXJ2ZXIgcXVlIG5vdXMgYXZvbnMgdW5lIHByZW1pw6hyZSBwYXJ0aWUgZHUgZ3JhcGhpcXVlIGNvbnRpbnUgc3VyIGVudmlyb24gMzAwIHNlY29uZGUgKCBldCBkb25jICQyMDAgXG11IG0kKXF1aSBwb3VycmFpdCDDqnRyZSBpbnRlcnByw6l0w6kgY29tbWUgdW5lIGNvdWNoZSBkJ2VhdSBzdGFnbmFudGUgZW50b3VyYW50IGxlIGNvcmFpbC4gTCfDqXRhcGUgc3VpdmFudGUgZXN0IGRlIHLDqWFsaXNlciDDoCBub3V2ZWF1IGNldHRlIGV4cMOpcmllbmNlIGV0IGRlIGxhIGZhaXJlIGRhbnMgbGUgc2VucyBjb250cmFpcmUgcG91ciBhdmFuY2VyIHZlcnMgbGUgY29yYWlsCgpgYGB7cn0KdDQyJT4lZmlsdGVyKHRlbXBzIDwgNzIwKS0+dDQyCmdncGxvdCh0NDIpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyg1MDAsIDcyMCkpCmBgYAoKUHJlbWnDqHJlIHJlbWFycXVlIHN1ciBsJ2V4cMOpcmllbmNlIGVuIHBhcnRhbnQgZHUgbWlsaWV1IGV0IGVuIGF2YW5jYW50IHZlcnMgbGUgY29lbm9zYXJjLCBvbiBvYnNlcnZlIHVuIGF1Z21lbnRhdGlvbiBwcm9ncmVzc2l2ZSBkZSBsJ294eWfDqG5lIHB1aXMgb24gYXR0ZWludCB1biBwcmVtaWVyIHBsYXRlYXUgbG9yc3F1ZSBsYSBzb25kZSB0b3VjaGUgbGUgY29lbm9zYXJjIGV0IHF1ZSBsYSBjb25jZW50cmF0aW9uIHLDqWF1Z21lbnRlIGxvcnNxdWUgbCdvbiB0b3VjaGUgcMOpbmV0cmUgbGVzIHRpc3N1cy4gSWwgc2VtYmxlIGNlcGVuZGF0IHF1J3VuIHNvcnRlIGRlIGNvdWNoZSBzdGFibGUgc2Ugc2l0dWEgw6AgcHJveGltaXTDqSBkdSBjb2Vub3NhcmMgKCB0b3VjaGUgYXUgdmlzdWVsbGUgw6AgNTAwIHNlY29uZGVzKQoKCgpgYGB7cn0KdDQzIDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNDMvVDQzMDMxMS50eHQiKQp0NDMkbnVtIDwtYXMubnVtZXJpYyh0NDMkRGF0ZSkKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQpUNDMwMzExX2xpZ2h0IDwtIHJlYWRfY3N2KCIuLi9kYXRhL1Q0My9UNDMwMzExX2xpZ2h0LmNzdiIpClQ0MzAzMTFfbGlnaHQlPiVyZW5hbWUoRGF0ZSA9IHRpbWUpLT5UNDMwMzExX2xpZ2h0ClQ0MzAzMTFfbGlnaHQkbnVtIDwtYXMubnVtZXJpYyhUNDMwMzExX2xpZ2h0JERhdGUpCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDQzX3Rlc3QgPC0gbGVmdF9qb2luKHQ0MywgVDQzMDMxMV9saWdodCwgYnkgPSAibnVtIikKCiNWaWV3KFQ0MzAzMTFfbGlnaHQpCgoKbGlicmFyeShsdWJyaWRhdGUpClQ0MzAzMTFfbGlnaHQgJT4lIHNlcGFyYXRlKGNvbCA9IERhdGUsaW50byA9IGMoInllYXIiLCAiaG91ciIpLCBzZXAgPSAiICIsIHJlbW92ZSA9IEZBTFNFKSAtPiBUNDMwMzExX2xpZ2h0Cgp0NDMgJT4lIHNlcGFyYXRlKGNvbCA9IERhdGUsaW50byA9IGMoInllYXIiLCAiaG91ciIpLCBzZXAgPSAiICIsIHJlbW92ZSA9IEZBTFNFKSAtPiB0NDMKCnQ0M190ZXN0IDwtIGxlZnRfam9pbih0NDMsIFQ0MzAzMTFfbGlnaHQsIGJ5ID0gImhvdXIiKQp0NDNfdGVzdCAlPiUgZmlsbChsaWdodCAsIC5kaXJlY3Rpb24gPSAiZG93biIpLT50NDNfdGVzdAp0NDNfdGVzdCRsaWdodFtpcy5uYSh0NDNfdGVzdCRsaWdodCldIDwtIDEKdDQzX3Rlc3QkbGlnaHQgPC0gYXMuZmFjdG9yKHQ0M190ZXN0JGxpZ2h0KQoKZ2dwbG90KGRhdGEgPSB0NDNfdGVzdCwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkgKwogIHRoZW1lX2J3KCkKCgoKYGBgCgoKYGBge3J9CnQ0NSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDQ1L1Q0NTA3MTEudHh0IikKdDQ2IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNDYvVDQ2MDcxMS50eHQiKQp0NDUgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q0NS9UNDUwNzExLnR4dCIpCgp0NTMgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q1My9UNTMxMDExLnR4dCIpCnQ1NCA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDU0L1Q1NDEwMTEudHh0IikKdDU1IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNTUvVDU1MTAxMS50eHQiKQoKdDU3IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS9UNTcvVDU3MTMxMS50eHQiKQp0NTggPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q1OC9UNTgxMzExLnR4dCIpCgp0NjAgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL1Q2MC9UNjAxMzExLnR4dCIpCnQ2MSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDYxL1Q2MTEzMTEudHh0IikKCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmdncGxvdCh0NDUpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKZ2dwbG90KHQ0NikrCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKQoKCmdncGxvdCh0NTMpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTQpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTUpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTcpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCmdncGxvdCh0NTgpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkKCgpnZ3Bsb3QodDYwKSsKICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMikpCgoKCmdncGxvdCh0NjEpKwogIGdlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkrCiAgdGhlbWVfYncoKQpgYGAKCiMgRXhww6lyaWVuY2UgZHUgMTEgZMOpY2VtYnJlIDIwMTcgCgoqIFV0aWxpc2F0aW9uIGRlIGxhIG5vdXZlbGxlIHNvbmRlIMOgIMOpbGVjdHJvZGUKCk9uIG9ic2VydmUgcXVlIGwndXRpbGlzYXRpb24gZCd1bmUgbm91dmVsbGUgbWljcm/DqWxlY3Ryb2RlIHBlcm1ldCBkJ29idGVuaXIgdW4gc2lnbmFsIHBsdXMgbmV0dGUuCgojIyBFeHBlcmllbmNlIDcwCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ3MCA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDcwL1Q3MDExMTIudHh0IikKI2NyZWF0aW9uIGQndW5lIG5vdXZlbGxlIHZhcmlhYmxlIGVuIGNoYXJhY3Rlcgp0NzAkdGltZSA8LWFzLmNoYXJhY3Rlcih0NzAkRGF0ZSkKCiNpbXBvcnRhdGlvbiBldCB0cmFuc2ZvIGRlIGxhIGRhdGUgClQ3MF9saWdodCA8LSByZWFkX2NzdigiLi4vZGF0YS9UNzAvbGlnaHQuY3N2IikKVDcwX2xpZ2h0JT4lcmVuYW1lKERhdGUgPSB0aW1lKS0+VDcwX2xpZ2h0ClQ3MF9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3RlcihUNzBfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3MF9jb21iIDwtIGxlZnRfam9pbih0NzAsIFQ3MF9saWdodCwgYnkgPSAidGltZSIpCnQ3MF9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3MF9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzBfY29tYiRsaWdodFtpcy5uYSh0NzBfY29tYiRsaWdodCldIDwtIDEKdDcwX2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3MF9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDcwX2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKKiBPbiBhIHVuIGJlYXUgc2lnbmFsCiogT24gcGV1dCByw6lkdWlyZSBsZSB0ZW1wcyBhdmFudCBkZSBkw6lidXRlciBsYSBtYW5pcCDDoCAyMCBzZWNvbmRlcyBldCBwbHVzIDUwIHNlY29uZGVzCiogT24gcGV1dCByw6lkdWlyZSBsZSB0ZW1wcyBkJ8OpY2xhaXJhZ2Ugw6AgMTUgc2Vjb25kZXMgZXQgcGx1cyAzMCBzZWNvbmRlcwoKIyMgNzEgCgoqIHBlcnRlIGR1IGZpY2hpZXIgc3VyIGxhIGx1bWnDqHJlCgpgYGB7cn0KI2ltcG9ydGF0aW9uCnQ3MSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvVDcxL1Q3MTExMTIudHh0IikKZ2dwbG90KGRhdGEgPSB0NzEsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKSsKICBnZW9tX2xpbmUoKQpgYGAKCgoKIyMgNzIgCgoKKiBJbCB5IGEgdW4gcHJvYmxlbWUgZW50cmUgbCdlY2xhaXJhZ2UgZXQgbGEgbWljcm/DqWxlY3Ryb2RlIMOgIHZvaXIKCgpgYGB7cn0KI3BhY2thZ2UgZW1wbG95w6kgZHVyYW50IGwnYW5hbHlzZQoKbGlicmFyeShyZWFkcikKbGlicmFyeSh0aWR5dmVyc2UpCgojaW1wb3J0YXRpb24KdDcyIDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS90NzIvdDcyMTExMi50eHQiKQojY3JlYXRpb24gZCd1bmUgbm91dmVsbGUgdmFyaWFibGUgZW4gY2hhcmFjdGVyCnQ3MiR0aW1lIDwtYXMuY2hhcmFjdGVyKHQ3MiREYXRlKQoKI2ltcG9ydGF0aW9uIGV0IHRyYW5zZm8gZGUgbGEgZGF0ZSAKdDcyX2xpZ2h0IDwtIHJlYWRfY3N2KCIuLi9kYXRhL3Q3Mi9saWdodC5jc3YiKQp0NzJfbGlnaHQlPiVyZW5hbWUoRGF0ZSA9IHRpbWUpLT50NzJfbGlnaHQKdDcyX2xpZ2h0JHRpbWUgPC0gYXMuY2hhcmFjdGVyKHQ3Ml9saWdodCREYXRlKQoKCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDcyX2NvbWIgPC0gbGVmdF9qb2luKHQ3MiwgdDcyX2xpZ2h0LCBieSA9ICJ0aW1lIikKdDcyX2NvbWIgJT4lIGZpbGwobGlnaHQgLCAuZGlyZWN0aW9uID0gImRvd24iKS0+dDcyX2NvbWIKCiNwcm9ibGVtZSBzcMOpY2lmaXF1ZSDDoCBjZSBqZXUgZGUgZG9ubsOpZXMKI3BldGl0ZSBjb3JyZWN0aW9uIHN1cHBsw6ltZW50YWlyZXMgY2FyIGplc3NpY2EgYSBkJ2Fib3JkIGxhbmPDqSBsZSBwcm9ncmFtbWUgZGUgbHVtacOocmUgYXZhbnQgbCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBzb25kCnQ3Ml9jb21iJGxpZ2h0W2lzLm5hKHQ3Ml9jb21iJGxpZ2h0KV0gPC0gMQp0NzJfY29tYiRsaWdodCA8LSBhcy5mYWN0b3IodDcyX2NvbWIkbGlnaHQpCgojIHBldGl0IGdyYXBoaXF1ZSBkZXMgZG9ubsOpZXMgYXZlYyBsYSBsdW1pw6hyZSAKZ2dwbG90KGRhdGEgPSB0NzJfY29tYiwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkKYGBgCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ3MyA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvdDczL3Q3MzExMTIudHh0IikKI2NyZWF0aW9uIGQndW5lIG5vdXZlbGxlIHZhcmlhYmxlIGVuIGNoYXJhY3Rlcgp0NzMkdGltZSA8LWFzLmNoYXJhY3Rlcih0NzMkRGF0ZSkKCiNpbXBvcnRhdGlvbiBldCB0cmFuc2ZvIGRlIGxhIGRhdGUgCnQ3M19saWdodCA8LSByZWFkX2NzdigiLi4vZGF0YS90NzMvbGlnaHQuY3N2IikKdDczX2xpZ2h0JT4lcmVuYW1lKERhdGUgPSB0aW1lKS0+dDczX2xpZ2h0CnQ3M19saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzNfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3M19jb21iIDwtIGxlZnRfam9pbih0NzMsIHQ3M19saWdodCwgYnkgPSAidGltZSIpCnQ3M19jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3M19jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzNfY29tYiRsaWdodFtpcy5uYSh0NzNfY29tYiRsaWdodCldIDwtIDEKdDczX2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3M19jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDczX2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCiMjIHQ3NAoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzQgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3NC90NzQxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc0JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc0JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzRfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc0L2xpZ2h0LmNzdiIpCnQ3NF9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3NF9saWdodAp0NzRfbGlnaHQkdGltZSA8LSBhcy5jaGFyYWN0ZXIodDc0X2xpZ2h0JERhdGUpCgoKI29iamVjdGlmIGZhaXJlIGNvbGxlciBsZSBkb2N1bWVudCBzdXIgbGUgdGVtcHMgZXQgbGUgZG9jdW1lbnQgc3VyIGwnw6ljbGFpcmFnZQp0NzRfY29tYiA8LSBsZWZ0X2pvaW4odDc0LCB0NzRfbGlnaHQsIGJ5ID0gInRpbWUiKQp0NzRfY29tYiAlPiUgZmlsbChsaWdodCAsIC5kaXJlY3Rpb24gPSAiZG93biIpLT50NzRfY29tYgoKI3Byb2JsZW1lIHNww6ljaWZpcXVlIMOgIGNlIGpldSBkZSBkb25uw6llcwojcGV0aXRlIGNvcnJlY3Rpb24gc3VwcGzDqW1lbnRhaXJlcyBjYXIgamVzc2ljYSBhIGQnYWJvcmQgbGFuY8OpIGxlIHByb2dyYW1tZSBkZSBsdW1pw6hyZSBhdmFudCBsJ2VucmVnaXN0cmVtZW50IGRlIGxhIHNvbmQKdDc0X2NvbWIkbGlnaHRbaXMubmEodDc0X2NvbWIkbGlnaHQpXSA8LSAxCnQ3NF9jb21iJGxpZ2h0IDwtIGFzLmZhY3Rvcih0NzRfY29tYiRsaWdodCkKCiMgcGV0aXQgZ3JhcGhpcXVlIGRlcyBkb25uw6llcyBhdmVjIGxhIGx1bWnDqHJlIApnZ3Bsb3QoZGF0YSA9IHQ3NF9jb21iLCBtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yLCBjb2xvciA9IGxpZ2h0KSkrCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IDEpKQpgYGAKCgojIyB0NzUKCiogZXJyZXVyIHN1ciBsYSByZXByw6lzZW50YXRpb24gZ3JhcGhpcXVlICwgamUgbmUgdm9pcyBwYXMgY29tbWVudCBjb3JyaWdlciBjZWxhCgoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzUgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3NS90NzUxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc1JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc1JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzVfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc1L2xpZ2h0LmNzdiIpCnQ3NV9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3NV9saWdodAp0NzVfbGlnaHQlPiVtdXRhdGUoRGF0ZSA9IERhdGUgKyAxKSAtPiB0NzVfbGlnaHQKdDc1X2xpZ2h0JHRpbWUgPC0gYXMuY2hhcmFjdGVyKHQ3NV9saWdodCREYXRlKQoKCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDc1X2NvbWIgPC0gbGVmdF9qb2luKHQ3NSwgdDc1X2xpZ2h0LCBieSA9ICJ0aW1lIikKdDc1X2NvbWIgJT4lIGZpbGwobGlnaHQgLCAuZGlyZWN0aW9uID0gImRvd24iKS0+dDc1X2NvbWIKCiNwcm9ibGVtZSBzcMOpY2lmaXF1ZSDDoCBjZSBqZXUgZGUgZG9ubsOpZXMKI3BldGl0ZSBjb3JyZWN0aW9uIHN1cHBsw6ltZW50YWlyZXMgY2FyIGplc3NpY2EgYSBkJ2Fib3JkIGxhbmPDqSBsZSBwcm9ncmFtbWUgZGUgbHVtacOocmUgYXZhbnQgbCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBzb25kCnQ3NV9jb21iJGxpZ2h0W2lzLm5hKHQ3NV9jb21iJGxpZ2h0KV0gPC0gMQp0NzVfY29tYiRsaWdodCA8LSBhcy5mYWN0b3IodDc1X2NvbWIkbGlnaHQpCgojIHBldGl0IGdyYXBoaXF1ZSBkZXMgZG9ubsOpZXMgYXZlYyBsYSBsdW1pw6hyZSAKZ2dwbG90KGRhdGEgPSB0NzVfY29tYiwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkKYGBgCgoKCiMjIHQ3NgoKCgoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzYgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3Ni90NzYxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc2JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc2JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzZfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc2L2xpZ2h0LmNzdiIpCnQ3Nl9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3Nl9saWdodAojdDc2X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc2X2xpZ2h0CnQ3Nl9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzZfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3Nl9jb21iIDwtIGxlZnRfam9pbih0NzYsIHQ3Nl9saWdodCwgYnkgPSAidGltZSIpCnQ3Nl9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3Nl9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzZfY29tYiRsaWdodFtpcy5uYSh0NzZfY29tYiRsaWdodCldIDwtIDEKdDc2X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3Nl9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc2X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgoKCiMjIHQ3NwoKCgoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzcgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3Ny90NzcxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc3JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc3JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzdfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc3L2xpZ2h0LmNzdiIpCnQ3N19saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3N19saWdodAojdDc3X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc3X2xpZ2h0CnQ3N19saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzdfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3N19jb21iIDwtIGxlZnRfam9pbih0NzcsIHQ3N19saWdodCwgYnkgPSAidGltZSIpCnQ3N19jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3N19jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzdfY29tYiRsaWdodFtpcy5uYSh0NzdfY29tYiRsaWdodCldIDwtIDEKdDc3X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3N19jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc3X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgoKIyMgdDc4CgoKKiBKZSBuJ2FpIHBhcyBkZSBmaWNoaWVyIHN1ciBsYSBsdW1pw6hyZQoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzggPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3OC90NzgxMTEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc4JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc4JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzhfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc4L2xpZ2h0LmNzdiIpCnQ3OF9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3OF9saWdodAojdDc4X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc4X2xpZ2h0CnQ3OF9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzhfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3OF9jb21iIDwtIGxlZnRfam9pbih0NzgsIHQ3OF9saWdodCwgYnkgPSAidGltZSIpCnQ3OF9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3OF9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzhfY29tYiRsaWdodFtpcy5uYSh0NzhfY29tYiRsaWdodCldIDwtIDEKdDc4X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3OF9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc4X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgoKIyBFeHDDqXJpZW5jZSBkdSAxMiBkw6ljZW1icmUgMjAxNyAKCiMjIHQ3OQoKCmBgYHtyfQojcGFja2FnZSBlbXBsb3nDqSBkdXJhbnQgbCdhbmFseXNlCgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiNpbXBvcnRhdGlvbgp0NzkgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q3OS90NzkxMjEyLnR4dCIpCiNjcmVhdGlvbiBkJ3VuZSBub3V2ZWxsZSB2YXJpYWJsZSBlbiBjaGFyYWN0ZXIKdDc5JHRpbWUgPC1hcy5jaGFyYWN0ZXIodDc5JERhdGUpCgojaW1wb3J0YXRpb24gZXQgdHJhbnNmbyBkZSBsYSBkYXRlIAp0NzlfbGlnaHQgPC0gcmVhZF9jc3YoIi4uL2RhdGEvdDc5L2xpZ2h0LmNzdiIpCnQ3OV9saWdodCU+JXJlbmFtZShEYXRlID0gdGltZSktPnQ3OV9saWdodAojdDc5X2xpZ2h0JT4lbXV0YXRlKERhdGUgPSBEYXRlICsgMSkgLT4gdDc5X2xpZ2h0CnQ3OV9saWdodCR0aW1lIDwtIGFzLmNoYXJhY3Rlcih0NzlfbGlnaHQkRGF0ZSkKCgojb2JqZWN0aWYgZmFpcmUgY29sbGVyIGxlIGRvY3VtZW50IHN1ciBsZSB0ZW1wcyBldCBsZSBkb2N1bWVudCBzdXIgbCfDqWNsYWlyYWdlCnQ3OV9jb21iIDwtIGxlZnRfam9pbih0NzksIHQ3OV9saWdodCwgYnkgPSAidGltZSIpCnQ3OV9jb21iICU+JSBmaWxsKGxpZ2h0ICwgLmRpcmVjdGlvbiA9ICJkb3duIiktPnQ3OV9jb21iCgojcHJvYmxlbWUgc3DDqWNpZmlxdWUgw6AgY2UgamV1IGRlIGRvbm7DqWVzCiNwZXRpdGUgY29ycmVjdGlvbiBzdXBwbMOpbWVudGFpcmVzIGNhciBqZXNzaWNhIGEgZCdhYm9yZCBsYW5jw6kgbGUgcHJvZ3JhbW1lIGRlIGx1bWnDqHJlIGF2YW50IGwnZW5yZWdpc3RyZW1lbnQgZGUgbGEgc29uZAp0NzlfY29tYiRsaWdodFtpcy5uYSh0NzlfY29tYiRsaWdodCldIDwtIDEKdDc5X2NvbWIkbGlnaHQgPC0gYXMuZmFjdG9yKHQ3OV9jb21iJGxpZ2h0KQoKIyBwZXRpdCBncmFwaGlxdWUgZGVzIGRvbm7DqWVzIGF2ZWMgbGEgbHVtacOocmUgCmdncGxvdChkYXRhID0gdDc5X2NvbWIsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIsIGNvbG9yID0gbGlnaHQpKSsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gMSkpCmBgYAoKCgojIyB0ODAKCgpgYGB7cn0KI3BhY2thZ2UgZW1wbG95w6kgZHVyYW50IGwnYW5hbHlzZQoKbGlicmFyeShyZWFkcikKbGlicmFyeSh0aWR5dmVyc2UpCgojaW1wb3J0YXRpb24KdDgwIDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS90ODAvdDgwMTIxMi50eHQiKQojY3JlYXRpb24gZCd1bmUgbm91dmVsbGUgdmFyaWFibGUgZW4gY2hhcmFjdGVyCnQ4MCR0aW1lIDwtYXMuY2hhcmFjdGVyKHQ4MCREYXRlKQoKI2ltcG9ydGF0aW9uIGV0IHRyYW5zZm8gZGUgbGEgZGF0ZSAKdDgwX2xpZ2h0IDwtIHJlYWRfY3N2KCIuLi9kYXRhL3Q4MC9saWdodC5jc3YiKQp0ODBfbGlnaHQlPiVyZW5hbWUoRGF0ZSA9IHRpbWUpLT50ODBfbGlnaHQKI3Q4MF9saWdodCU+JW11dGF0ZShEYXRlID0gRGF0ZSArIDEpIC0+IHQ4MF9saWdodAp0ODBfbGlnaHQkdGltZSA8LSBhcy5jaGFyYWN0ZXIodDgwX2xpZ2h0JERhdGUpCgoKI29iamVjdGlmIGZhaXJlIGNvbGxlciBsZSBkb2N1bWVudCBzdXIgbGUgdGVtcHMgZXQgbGUgZG9jdW1lbnQgc3VyIGwnw6ljbGFpcmFnZQp0ODBfY29tYiA8LSBsZWZ0X2pvaW4odDgwLCB0ODBfbGlnaHQsIGJ5ID0gInRpbWUiKQp0ODBfY29tYiAlPiUgZmlsbChsaWdodCAsIC5kaXJlY3Rpb24gPSAiZG93biIpLT50ODBfY29tYgoKI3Byb2JsZW1lIHNww6ljaWZpcXVlIMOgIGNlIGpldSBkZSBkb25uw6llcwojcGV0aXRlIGNvcnJlY3Rpb24gc3VwcGzDqW1lbnRhaXJlcyBjYXIgamVzc2ljYSBhIGQnYWJvcmQgbGFuY8OpIGxlIHByb2dyYW1tZSBkZSBsdW1pw6hyZSBhdmFudCBsJ2VucmVnaXN0cmVtZW50IGRlIGxhIHNvbmQKdDgwX2NvbWIkbGlnaHRbaXMubmEodDgwX2NvbWIkbGlnaHQpXSA8LSAxCnQ4MF9jb21iJGxpZ2h0IDwtIGFzLmZhY3Rvcih0ODBfY29tYiRsaWdodCkKCiMgcGV0aXQgZ3JhcGhpcXVlIGRlcyBkb25uw6llcyBhdmVjIGxhIGx1bWnDqHJlIApnZ3Bsb3QoZGF0YSA9IHQ4MF9jb21iLCBtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yLCBjb2xvciA9IGxpZ2h0KSkrCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IDEpKQpgYGAKCgoKIyMgdDgxCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ4MSA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvdDgxL3Q4MTEyMTIudHh0IikKCiMgcGV0aXQgZ3JhcGhpcXVlIGRlcyBkb25uw6llcyBhdmVjIGxhIGx1bWnDqHJlIApnZ3Bsb3QoZGF0YSA9IHQ4MSwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMikpKwogIGdlb21fbGluZSgpCmBgYAoKCgoKIyMgdDgyCgoKYGBge3J9CiNwYWNrYWdlIGVtcGxvecOpIGR1cmFudCBsJ2FuYWx5c2UKCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkodGlkeXZlcnNlKQoKI2ltcG9ydGF0aW9uCnQ4MiA8LW1pY3JvTzJfaW1wb3J0MihmaWxlID0gIi4uL2RhdGEvdDgyL3Q4MjEyMTIudHh0IikKI2NyZWF0aW9uIGQndW5lIG5vdXZlbGxlIHZhcmlhYmxlIGVuIGNoYXJhY3Rlcgp0ODIkdGltZSA8LWFzLmNoYXJhY3Rlcih0ODIkRGF0ZSkKCiNpbXBvcnRhdGlvbiBldCB0cmFuc2ZvIGRlIGxhIGRhdGUgCnQ4Ml9saWdodCA8LSByZWFkX2NzdigiLi4vZGF0YS90ODIvbGlnaHQuY3N2IikKdDgyX2xpZ2h0JT4lcmVuYW1lKERhdGUgPSB0aW1lKS0+dDgyX2xpZ2h0CiN0ODJfbGlnaHQlPiVtdXRhdGUoRGF0ZSA9IERhdGUgKyAxKSAtPiB0ODJfbGlnaHQKdDgyX2xpZ2h0JHRpbWUgPC0gYXMuY2hhcmFjdGVyKHQ4Ml9saWdodCREYXRlKQoKCiNvYmplY3RpZiBmYWlyZSBjb2xsZXIgbGUgZG9jdW1lbnQgc3VyIGxlIHRlbXBzIGV0IGxlIGRvY3VtZW50IHN1ciBsJ8OpY2xhaXJhZ2UKdDgyX2NvbWIgPC0gbGVmdF9qb2luKHQ4MiwgdDgyX2xpZ2h0LCBieSA9ICJ0aW1lIikKdDgyX2NvbWIgJT4lIGZpbGwobGlnaHQgLCAuZGlyZWN0aW9uID0gImRvd24iKS0+dDgyX2NvbWIKCiNwcm9ibGVtZSBzcMOpY2lmaXF1ZSDDoCBjZSBqZXUgZGUgZG9ubsOpZXMKI3BldGl0ZSBjb3JyZWN0aW9uIHN1cHBsw6ltZW50YWlyZXMgY2FyIGplc3NpY2EgYSBkJ2Fib3JkIGxhbmPDqSBsZSBwcm9ncmFtbWUgZGUgbHVtacOocmUgYXZhbnQgbCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBzb25kCnQ4Ml9jb21iJGxpZ2h0W2lzLm5hKHQ4Ml9jb21iJGxpZ2h0KV0gPC0gMQp0ODJfY29tYiRsaWdodCA8LSBhcy5mYWN0b3IodDgyX2NvbWIkbGlnaHQpCgojIHBldGl0IGdyYXBoaXF1ZSBkZXMgZG9ubsOpZXMgYXZlYyBsYSBsdW1pw6hyZSAKZ2dwbG90KGRhdGEgPSB0ODJfY29tYiwgbWFwcGluZyA9IGFlcyh4ID0gdGVtcHMsIHkgPSBPMiwgY29sb3IgPSBsaWdodCkpKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSAxKSkKYGBgCgoKCgojIHQ4NyBWw6lyaWZpY2F0aW9uIGR1IHByb2ZpbCBlbiBveHlnw6huZQoKCmBgYHtyfQp0ODcgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q4Ny90ODcxOTEyLnR4dCIpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmdncGxvdCh0ODcsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKSsKICBnZW9tX2xpbmUoKQoKCihtYXgodDg3JHRlbXBzKSkvMTUKCk4gPC0gMTAKcGFzX2RlX2Rpc3RhbmNlIDwtIDQwCmRpc3RhbmNlX2luaXRpYWxlIDwtIC00MDAKcGFzX2RlX3RlbXBzIDwtIDE1CnRlbXBzX2luaXRpYWxlIDwtMjYKCgpuIDwtYygwOk4pCgpkaXN0IDwtIGRhdGFfZnJhbWUobiA9IG4pCgpkaXN0JT4lIG11dGF0ZSh0ZW1wcyA9IChuKnBhc19kZV90ZW1wcykrdGVtcHNfaW5pdGlhbGUpLT5kaXN0CgpkaXN0JT4lbXV0YXRlKGRpc3RhbmNlID0gKG4qcGFzX2RlX2Rpc3RhbmNlKStkaXN0YW5jZV9pbml0aWFsZSktPmRpc3QKCgp0ODckdGVtcHMgPC0gcm91bmQodDg3JHRlbXBzLCBkaWdpdHMgPSAwKQp0ODc8LSBsZWZ0X2pvaW4odDg3LCBkaXN0LCBieSA9ICJ0ZW1wcyIpCnQ4NyA8LSB0aWR5cjo6ZmlsbCh0ODcsIGRpc3RhbmNlLCAuZGlyZWN0aW9uID0gImRvd24iKSAKCgpnZ3Bsb3QodDg3LCBtYXBwaW5nID0gYWVzKHggPSBkaXN0YW5jZSwgeSA9IE8yKSkrCiAgZ2VvbV9saW5lKCkrCiAgZ2VvbV9zbW9vdGgoKQoKYGBgCgojIHQ4OCBWw6lyaWZpYWN0aW9uIGR1IHByb2ZpbCBzdWl0ZSBkZSB0NzcKCgpgYGB7cn0KdDg4IDwtbWljcm9PMl9pbXBvcnQyKGZpbGUgPSAiLi4vZGF0YS90ODgvdDg4MTkxMi50eHQiKQoKbGlicmFyeSh0aWR5dmVyc2UpCgpnZ3Bsb3QodDg4LCBtYXBwaW5nID0gYWVzKHggPSB0ZW1wcywgeSA9IE8yKSkrCiAgZ2VvbV9saW5lKCkKCihtYXgodDg4JHRlbXBzKS0yNSkvMTUKCk4gPC0gMzAKcGFzX2RlX2Rpc3RhbmNlIDwtIDEwCmRpc3RhbmNlX2luaXRpYWxlIDwtIC0zMDAKcGFzX2RlX3RlbXBzIDwtIDE1CnRlbXBzX2luaXRpYWxlIDwtMjYKCgpuIDwtYygwOk4pCgpkaXN0IDwtIGRhdGFfZnJhbWUobiA9IG4pCgpkaXN0JT4lIG11dGF0ZSh0ZW1wcyA9IChuKnBhc19kZV90ZW1wcykrdGVtcHNfaW5pdGlhbGUpLT5kaXN0CgpkaXN0JT4lbXV0YXRlKGRpc3RhbmNlID0gKG4qcGFzX2RlX2Rpc3RhbmNlKStkaXN0YW5jZV9pbml0aWFsZSktPmRpc3QKCgp0ODgkdGVtcHMgPC0gcm91bmQodDg4JHRlbXBzLCBkaWdpdHMgPSAwKQoKZGlzdCR0ZW1wcyA8LWFzLmNoYXJhY3RlcihkaXN0JHRlbXBzKQojIyBSZWNvZGFnZSBkZSBkaXN0JHRlbXBzCmRpc3QkdGVtcHMgPC0gcmVjb2RlKGRpc3QkdGVtcHMsCiAgICAgICAgICAgICAgICIyMjEiID0gIjIyMiIsCiAgICAgICAgICAgICAgICIyMzYiID0gIjIzNyIsCiAgICAgICAgICAgICAgICIyNTEiID0gIjI1MiIsCiAgICAgICAgICAgICAgICIyNjYiID0gIjI2NyIsCiAgICAgICAgICAgICAgICIyODEiID0gIjI4MiIsCiAgICAgICAgICAgICAgICIyOTYiID0gIjI5NyIsCiAgICAgICAgICAgICAgICIzMTEiID0gIjMxMiIsCiAgICAgICAgICAgICAgICIzMjYiID0gIjMyNyIpCmRpc3QkdGVtcHMgPC0gYXMubnVtZXJpYyhkaXN0JHRlbXBzKQoKCnQ4ODwtIGxlZnRfam9pbih0ODgsIGRpc3QsIGJ5ID0gInRlbXBzIikKdDg4IDwtIHRpZHlyOjpmaWxsKHQ4OCwgZGlzdGFuY2UsIC5kaXJlY3Rpb24gPSAiZG93biIpIAoKdDg4JGRpc3RfdmVyaWYgPC0gYXMuZmFjdG9yKHQ4OCRkaXN0YW5jZSkKbGV2ZWxzKHQ4OCRkaXN0X3ZlcmlmKQoKZ2dwbG90KHQ4OCwgbWFwcGluZyA9IGFlcyh4ID0gZGlzdGFuY2UsIHkgPSBPMikpKwogIGdlb21fbGluZSgpKwogIGdlb21fc21vb3RoKCkKYGBgCgoKIyB0ODkgdmFyaWF0aW9uIGRlIGwnaW50ZW5zaXTDqSBkZSBsYSBsdW1pw6hyZSAKCmBgYHtyfQp0OTYgPC1taWNyb08yX2ltcG9ydDIoZmlsZSA9ICIuLi9kYXRhL3Q5Ni85NjIxMTIudHh0IikKCmdncGxvdCh0OTYsIG1hcHBpbmcgPSBhZXMoeCA9IHRlbXBzLCB5ID0gTzIpKSsKICBnZW9tX2xpbmUoKQpgYGAKCg==